﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Linq.Expressions;
using TubesMetnum4.det;
using System.IO;

namespace TubesMetnum4
{
    public partial class Form1 : Form 
    {
        Soal soal;
        public Form1()
        {
            InitializeComponent();
            comboBox_pilihansoal.SelectedIndex = 0;
            comboBox_ordelegendre.SelectedIndex = 2;
            soal = new Soal();
            loadsoal5();

            //nanti kalau udah final dihapus yah
            textBox_bataskiri.Text = "0";
            textBox_bataskanan.Text = "100";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int jumlahpias = 1;
            if (!int.TryParse(textBox2.Text,out jumlahpias))
            {
                jumlahpias = 200;
                textBox2.Text = jumlahpias.ToString();
            }
            TipeMetode tipeMetode;
            if (radioButtonTrapesium.Checked) tipeMetode = TipeMetode.Trapesium;
            else if (radioButton_titikTengah.Checked) tipeMetode = TipeMetode.TitikTengah;
            else if (radioButton_simpson13.Checked) tipeMetode = TipeMetode.Simpson13;
            else if (radioButton_simpson38.Checked) tipeMetode = TipeMetode.Simpson38;
            else if (radioButton_roomberg.Checked) { tipeMetode = TipeMetode.Romberg;
            double ni = 2;
            int i = 1;
            while (ni < jumlahpias)
            {
                ni = 2 * ni;
                i++;
            }
            jumlahpias = i;
            textBox2.Text = ni.ToString() ;
            }
            else if (radioButton_gauss.Checked) tipeMetode = TipeMetode.GaussLegendre;
            else tipeMetode = TipeMetode.Invalid;

            double batasKiri, batasKanan;
            if (!(double.TryParse(textBox_bataskiri.Text, out batasKiri) && double.TryParse(textBox_bataskanan.Text, out batasKanan)))
                MessageBox.Show("Batas integrasi tidak valid");
            else
            {
                if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Bidang Matematika"))
                {
                    switch (tipeMetode)
                    {
                        case TipeMetode.Trapesium: textBoxhasil.Text = Metode.Trapesium(Soal.nomor1, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.TitikTengah: textBoxhasil.Text = Metode.TitikTengah(Soal.nomor1, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson13: textBoxhasil.Text = Metode.Simpson13(Soal.nomor1, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson38: textBoxhasil.Text = Metode.Simpson38(Soal.nomor1, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Romberg: textBoxhasil.Text = Metode.Roomberg(Soal.nomor1, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.GaussLegendre: 
                            int orde = comboBox_ordelegendre.SelectedIndex + 2;
                            textBoxhasil.Text = Metode.GaussLegendre(Soal.nomor1, batasKiri, batasKanan, orde).ToString(); break;
                        default: textBoxhasil.Text = "Pilih metode"; break;
                    }
                }
                else if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Bidang Fisika 1"))
                {
                    Double n = 1;
                    if (!double.TryParse(textBox1.Text, out n))
                    {
                        n = 1;
                        textBox1.Text = n.ToString();
                    }
                    soal.setlamda2(Double.Parse(textBox1.Text.ToString()));
                    switch (tipeMetode)
                    {
                        case TipeMetode.Trapesium: textBoxhasil.Text = Metode.Trapesium2(soal.soal2, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.TitikTengah: textBoxhasil.Text = Metode.TitikTengah2(soal.soal2, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson13: textBoxhasil.Text = Metode.Simpson132(soal.soal2, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson38: textBoxhasil.Text = Metode.Simpson382(soal.soal2, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Romberg: textBoxhasil.Text = Metode.Roomberg2(soal.soal2, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.GaussLegendre:
                            int orde = comboBox_ordelegendre.SelectedIndex + 2;
                            textBoxhasil.Text = Metode.GaussLegendre2(soal.soal2, batasKiri, batasKanan, orde).ToString(); break;
                        default: textBoxhasil.Text = "Pilih metode"; break;
                    }
                }
                else if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Integral Ganda"))
                {
                   
                        switch (tipeMetode)
                        {
                            case TipeMetode.Trapesium: textBoxhasil.Text = 
                                (Metode.Trapesium(Soal.nomor3a, batasKiri, batasKanan, jumlahpias)*
                                Metode.Trapesium(Soal.nomor3b, batasKiri, batasKanan, jumlahpias)).ToString();break;
                            case TipeMetode.TitikTengah: textBoxhasil.Text =
                                (Metode.TitikTengah(Soal.nomor3a, batasKiri, batasKanan, jumlahpias) *
                                Metode.TitikTengah(Soal.nomor3b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                            case TipeMetode.Simpson13: textBoxhasil.Text =
                                (Metode.Simpson13(Soal.nomor3a, batasKiri, batasKanan, jumlahpias) *
                                Metode.Simpson13(Soal.nomor3b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                            case TipeMetode.Simpson38: textBoxhasil.Text =
                                (Metode.Simpson38(Soal.nomor3a, batasKiri, batasKanan, jumlahpias) *
                                Metode.Simpson38(Soal.nomor3b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                            case TipeMetode.Romberg: textBoxhasil.Text =
                                (Metode.Roomberg(Soal.nomor3a, batasKiri, batasKanan, jumlahpias) *
                                Metode.Roomberg(Soal.nomor3b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                            case TipeMetode.GaussLegendre:
                                int orde = comboBox_ordelegendre.SelectedIndex + 2;
                                textBoxhasil.Text =
                                   (Metode.GaussLegendre(Soal.nomor3a, batasKiri, batasKanan, orde) *
                                    Metode.GaussLegendre(Soal.nomor3b, batasKiri, batasKanan, orde)).ToString(); break;
                            default: textBoxhasil.Text = "Pilih metode"; break;
                        }
                    
                }
                else if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Bidang Kimia"))
                {
                    //batasKiri = Math.Pow(10,-5);
                    batasKanan = Double.Parse(comboBox1.Text);
                    soal.setsoal(batasKanan);
                    switch (tipeMetode)
                    {
                        case TipeMetode.Trapesium: textBoxhasil.Text = Metode.Trapesium(Soal.nomor4, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.TitikTengah: textBoxhasil.Text = Metode.TitikTengah(Soal.nomor4, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson13: textBoxhasil.Text = Metode.Simpson13(Soal.nomor4, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson38: textBoxhasil.Text = Metode.Simpson38(Soal.nomor4, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Romberg: textBoxhasil.Text = Metode.Roomberg(Soal.nomor4, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.GaussLegendre:
                            int orde = comboBox_ordelegendre.SelectedIndex + 2;
                            textBoxhasil.Text = Metode.GaussLegendre(Soal.nomor4, batasKiri, batasKanan, orde).ToString(); break;
                        default: textBoxhasil.Text = "Pilih metode"; break;
                    }
                }
                else if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Bidang Transportasi"))
                {
                    soal.gensoal();
                    batasKiri = 1;
                    batasKanan = soal.C5a.ToList().Count;
                    jumlahpias = (int)(batasKanan - batasKiri);
                    textBox_bataskanan.Text = batasKanan.ToString();
                    textBox_bataskiri.Text = batasKiri.ToString();
                    textBox2.Text = jumlahpias.ToString();
                    switch (tipeMetode)
                    {
                        case TipeMetode.Trapesium: textBoxhasil.Text =
                            (Metode.Trapesium2(soal.soal5a, batasKiri, batasKanan, jumlahpias) +
                            Metode.Trapesium2(soal.soal5b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                        case TipeMetode.TitikTengah: textBoxhasil.Text =
                            (Metode.TitikTengah2(soal.soal5a, batasKiri, batasKanan, jumlahpias) +
                            Metode.TitikTengah2(soal.soal5b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                        case TipeMetode.Simpson13: textBoxhasil.Text =
                            (Metode.Simpson132(soal.soal5a, batasKiri, batasKanan, jumlahpias) +
                            Metode.Simpson132(soal.soal5b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                        case TipeMetode.Simpson38: textBoxhasil.Text =
                            (Metode.Simpson382(soal.soal5a, batasKiri, batasKanan, jumlahpias) +
                            Metode.Simpson382(soal.soal5b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                        case TipeMetode.Romberg: textBoxhasil.Text =
                            (Metode.Roomberg2(soal.soal5a, batasKiri, batasKanan, jumlahpias) +
                            Metode.Roomberg2(soal.soal5b, batasKiri, batasKanan, jumlahpias)).ToString(); break;
                        case TipeMetode.GaussLegendre:
                            int orde = comboBox_ordelegendre.SelectedIndex + 2;
                            textBoxhasil.Text =
                               (Metode.GaussLegendre2(soal.soal5a, batasKiri, batasKanan, orde) +
                                Metode.GaussLegendre2(soal.soal5b, batasKiri, batasKanan, orde)).ToString(); break;
                        default: textBoxhasil.Text = "Pilih metode"; break;
                    }
                }
                else if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Bidang Fisika 2"))
                {
                    batasKiri = Math.PI / 20;
                    batasKanan = Math.PI / 2;

                    jumlahpias = (int)(batasKanan - batasKiri);
                    textBox_bataskanan.Text = batasKanan.ToString();
                    textBox_bataskiri.Text = batasKiri.ToString();
                    textBox2.Text = jumlahpias.ToString();
                    switch (tipeMetode)
                    {
                        case TipeMetode.Trapesium: textBoxhasil.Text = Metode.Trapesium(Soal.nomor6, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.TitikTengah: textBoxhasil.Text = Metode.TitikTengah(Soal.nomor6, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson13: textBoxhasil.Text = Metode.Simpson13(Soal.nomor6, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson38: textBoxhasil.Text = Metode.Simpson38(Soal.nomor6, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Romberg: textBoxhasil.Text = Metode.Roomberg(Soal.nomor6, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.GaussLegendre:
                            int orde = comboBox_ordelegendre.SelectedIndex + 2;
                            textBoxhasil.Text = Metode.GaussLegendre(Soal.nomor6, batasKiri, batasKanan, orde).ToString(); break;
                        default: textBoxhasil.Text = "Pilih metode"; break;
                    }
                }
                else if (comboBox_pilihansoal.SelectedItem.ToString().Equals("Bidang Kelistrikan"))
                {
                    soal.set7a(1);
                    switch (tipeMetode)
                    {
                        case TipeMetode.Trapesium: textBoxhasil.Text = Metode.Trapesium(Soal.nomor7a, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.TitikTengah: textBoxhasil.Text = Metode.TitikTengah(Soal.nomor7a, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson13: textBoxhasil.Text = Metode.Simpson13(Soal.nomor7a, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Simpson38: textBoxhasil.Text = Metode.Simpson38(Soal.nomor7a, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.Romberg: textBoxhasil.Text = Metode.Roomberg(Soal.nomor7a, batasKiri, batasKanan, jumlahpias).ToString(); break;
                        case TipeMetode.GaussLegendre:
                            int orde = comboBox_ordelegendre.SelectedIndex + 2;
                            textBoxhasil.Text = Metode.GaussLegendre(Soal.nomor7a, batasKiri, batasKanan, orde).ToString(); break;
                        default: textBoxhasil.Text = "Pilih metode"; break;
                    }
                }
            }
        }

        private void comboBox_pilihansoal_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox combobox = (ComboBox)sender;
            int selected_index = combobox.SelectedIndex;
            //expressionPlotter1.RemoveAllExpressions();
            textBox1.Visible = false;
            label3.Visible = false;
            textBox_bataskanan.Enabled = true;
            textBox_bataskiri.Enabled = true;
            comboBox1.Visible = false;
            textBox_bataskanan.Visible = true;
            switch (selected_index)
            {
                case 0:
                    //expressionPlotter1.AddExpression(Soal.nomor1, Color.Red, true);
                    break;
                case 1:
                    textBox1.Visible = true;
                    label3.Visible = true;
                    label3.Text = "T = ";
                    break;
                case 2:
                    textBox_bataskanan.Enabled = false;
            textBox_bataskiri.Enabled = false;
            textBox_bataskanan.Text = "1";
            textBox_bataskiri.Text = "0";
                    break;
                case 3:
                    comboBox1.Visible = true;
            textBox_bataskanan.Visible = false;
                    //expressionPlotter1.AddExpression(Soal.nomor4, Color.Red, true);
                    break;
                case 4:
                     
                    //expressionPlotter1.AddExpression(Soal.nomor5, Color.Red, true);
                    break;
                case 5:
                    //expressionPlotter1.AddExpression(Soal.nomor6, Color.Red, true);
                    break;
                case 6:
                    ///expressionPlotter1.AddExpression(Soal.nomor7, Color.Red, true);
                    break;
                case 7:
                    ///expressionPlotter1.AddExpression(Soal.test, Color.Red, true);
                    break;
            }

            //expressionPlotter1.Refresh();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {

        }

        private void loadsoal5()
        {
            dataGridView1.Rows.Clear();
            for (int i = 1; i <= soal.C5a.ToList().Count; i++)
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i-1].Cells[0].Value = i;
            dataGridView1.Rows[i-1].Cells[1].Value = soal.C5a[i];
            dataGridView1.Rows[i-1].Cells[2].Value = soal.C5b[i];
            }
        }

        private void save()
        {
            soal.C5a = new Dictionary<double, double>();
            soal.C5b = new Dictionary<double, double>();
            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {
                
                soal.C5a.Add((double)i+1,Double.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString()));
                soal.C5b.Add((double)i + 1, Double.Parse(dataGridView1.Rows[i].Cells[2].Value.ToString()));
            }
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            OpenFileDialog ofn = new OpenFileDialog();
            ofn.Filter = "Text Files (*.txt)|*.txt";
            ofn.Title = "Type File";
            //while (true)
            {
                if (ofn.ShowDialog() == DialogResult.Cancel)
                    return;
                FileStream strm;
                try
                {
                    strm = new FileStream(ofn.FileName, FileMode.Open, FileAccess.Read);
                    StreamReader rdr = new StreamReader(strm);
                    dataGridView1.Rows.Clear();
                    int i = 1;
                    while (rdr.Peek() >= 0)
                    {
                        string str = rdr.ReadLine();
                        char[] a = " ".ToCharArray();
                        string[] str2 = str.Split(a);
                            dataGridView1.Rows.Add();
                            dataGridView1.Rows[i - 1].Cells[0].Value = str2[0];
                            dataGridView1.Rows[i - 1].Cells[1].Value = str2[1];
                            dataGridView1.Rows[i - 1].Cells[2].Value = str2[2];
                        Console.WriteLine(str);
                        i++;
                    }
                    save();
                }
                catch (Exception)
                {
                    MessageBox.Show("Error opening file", "File Error",
                                     MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                ofn.Title = "Next File to Type";
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            save();
        }
    }

    public enum TipeMetode {Trapesium,TitikTengah,Simpson13,Simpson38,Romberg,GaussLegendre,Invalid};
}
